#ifndef __MAT4_H__
#define __MAT4_H__

#include "vec4.h"

namespace libvec
{
  struct dmat4;

  struct mat4
  {
    vec4 v1, v2, v3, v4;

    mat4();
    mat4(dmat4 m);
    mat4(float value);
    mat4(float n11, float n12, float n13, float n14,
        float n21, float n22, float n23, float n24,
        float n31, float n32, float n33, float n34,
        float n41, float n42, float n43, float n44);
    mat4(vec4 v1, vec4 v2, vec4 v3, vec4 v4);

    vec4 &operator[](int index);

    mat4 operator=(mat4 m);

    bool operator==(mat4 m);
    bool operator!=(mat4 m);

    mat4 &operator+();
    mat4 &operator-();

    mat4 operator+(mat4 m);
    mat4 operator+=(mat4 m);
    mat4 operator-(mat4 m);
    mat4 operator-=(mat4 m);
    vec4 operator*(vec4 v);
    mat4 operator*(mat4 m);
    mat4 operator*=(mat4 m);
    mat4 operator*(float scale);
    mat4 operator*=(float scale);
    mat4 operator/(float scale);
    mat4 operator/=(float scale);
  };
}

#endif /* __MAT4_H__ */
